package com.shop.cereshop.app.utils;

import com.shop.cereshop.commons.constant.CoReturnFormat;
import com.shop.cereshop.commons.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.regex.Pattern;

/**
 * @description: 密码工具类
 * @author lx
 * @date 2025/7/24 11:38
 * @version 1.0
 */
@Slf4j
public class PwdValidUtil {
    /**
     * 密码格式校验
     * @param password 要校验的密码
     * @return
     */
    public static boolean isPasswordInvalid(String password) {
        // 检查长度：8-12位
        if (password == null || password.length() < 8 || password.length() > 12) {
            return true;
        }

        // 检查至少包含两种字符类型（字母、数字、符号）
        int categoryCount = 0;
        if (containsLetter(password)) {
            categoryCount++;
        }
        if (containsDigit(password)) {
            categoryCount++;
        }
        if (containsSymbol(password)) {
            categoryCount++;
        }

        return categoryCount < 2;
    }




    public static Result<Object> validatePassword(String password) {
        if (StringUtils.isBlank(password) || password.length() < 6) {
            return Result.failed(CoReturnFormat.PASSWORD_FORMAT_ERROR, "密码长度需大于6个字符");
        }

        boolean hasLetter = PwdValidUtil.containsLetter(password);
        boolean hasDigit = PwdValidUtil.containsDigit(password);
//        boolean hasSymbol = PwdValidUtil.containsSymbol(password);

        if (!hasLetter) {
            return Result.failed(CoReturnFormat.PASSWORD_FORMAT_ERROR, "密码至少包含一个字母");
        }
        if (!hasDigit) {
            return Result.failed(CoReturnFormat.PASSWORD_FORMAT_ERROR, "密码至少包含一个数字");
        }

//        int categoryCount = (hasLetter ? 1 : 0) + (hasDigit ? 1 : 0) + (hasSymbol ? 1 : 0);
//        if (categoryCount < 2) {
//            return Result.failed(CoReturnFormat.PASSWORD_FORMAT_ERROR,
//                    "密码需包含以下任意两种组合：\n" +
//                            "- 字母 + 数字\n" +
//                            "- 字母 + 特殊符号\n" +
//                            "- 数字 + 特殊符号");
//        }

        return Result.success();
    }

    private static final Pattern LETTER_PATTERN = Pattern.compile("[a-zA-Z]");
    private static final Pattern DIGIT_PATTERN = Pattern.compile("[0-9]");
    private static final Pattern SYMBOL_PATTERN = Pattern.compile("[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>/?]");

    /**
     * 检查密码是否包含字母
     * @param password   密码
     * @return  boolean
     */
    public static boolean containsLetter(String password) {
        return LETTER_PATTERN.matcher(password).find();
    }

    /**
     * 检查密码是否包含数字
     * @param password   密码
     * @return  boolean
     */
    public static boolean containsDigit(String password) {
        return DIGIT_PATTERN.matcher(password).find();
    }

    /**
     * 检查密码是否包含符号 !@#$%^&*()_+-=[]{};':"\|,.<>/?
     * @param password   密码
     * @return  boolean
     */
    public static boolean containsSymbol(String password) {
        // 定义符号范围，根据需求调整
        return SYMBOL_PATTERN.matcher(password).find();
    }

    public static void main(String[] args) {
        Result<Object> result = PwdValidUtil.validatePassword("12345678");
        log.info("result: {}", result.toString());
    }

}
